/**
 * ReportGear(2011)
 */
package com.reportgear.core.event;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.log4j.Logger;

/**
 * 核心-通用监听器支持
 * 
 * @version 1.0 2011-4-22
 * @author <a herf="lexloo@gmail.com">lexloo</a>
 * @since Report 1.0
 */
public class ListenerSupport<T> {
	private static final Logger logger = Logger.getLogger(ListenerSupport.class.getName());
	// 监听器列表
	private ArrayList<T> listeners;
	// 消息源
	protected Object source;

	/**
	 * 构建对象
	 * 
	 * @param sourceBean
	 *            事件源对象
	 */
	public ListenerSupport(Object source) {
		this.source = source;
	}

	/**
	 * 设置事件源
	 * 
	 * @param source
	 *            事件源对象
	 */
	protected void setSource(Object source) {
		this.source = source;
	}

	/**
	 * @return 获取事件源
	 */
	protected Object getSource() {
		return this.source;
	}

	/**
	 * 添加监听器
	 * 
	 * @param listener
	 *            监听器
	 */
	public synchronized void addListener(T listener) {
		if (listeners == null) {
			listeners = new ArrayList<T>();
		}

		if (!listeners.contains(listener)) {
			listeners.add(listener);

			if (logger.isDebugEnabled()) {
				logger.debug("添加监听器:" + listener.getClass());
			}
		}
	}

	/**
	 * 移除监听器
	 * 
	 * @param listener
	 *            需要移除的监听器
	 */
	public synchronized void removeListener(T listener) {
		if (listeners != null) {
			listeners.remove(listener);
		}
		
		if (logger.isDebugEnabled()) {
			logger.debug("移除监听器:" + listener.getClass());
		}
	}

	/**
	 * 清除所有监听器
	 */
	public void removeAll() {
		if (listeners != null) {
			listeners.clear();
		}
	}

	/**
	 * 返回监听器的数量
	 */
	public int size() {
		int size = 0;
		if (listeners != null) {
			size = listeners.size();
		}

		return size;
	}

	/**
	 * 返回所有监听器
	 * 
	 * @return 所有监听器
	 */
	@SuppressWarnings("unchecked")
	public synchronized List<T> getListeners() {
		if (listeners == null) {
			return Collections.emptyList();
		}

 		return (List) listeners.clone();
	}
}